#include <iostream>
#include "bind_test.hpp"
#include <functional>

//int add(int a, int b) {
//    return a + b;
//}

int add() {
    return __LINE__;
}

void Bind_test::play() {
    std::cout << "bind test ...\n";
    
    /*
    *** 当 bind 的函数为成员函数时，需要指定 this 指针（如果不指定，不能正常被执行），且要对成员函数取地址
     */
//    printfObj();
    auto f = std::bind(&Bind_test::printfObj, this);
    f();
    
    std::cout << "---------------------\n";
    
    using namespace std::placeholders;
    
    /*
     *** 当 bind 的函数为普通函数时，直接填函数名即可（函数名即表示函数的入口地址）
     */
//    auto temp = std::bind(add, _1, _2);
//    std::cout << "sum: " << temp(2, 3) << std::endl;
    
    auto temp1 = std::bind(add);
    std::cout << "sum: " << temp1() << std::endl;
}

void Bind_test::printfObj() {
    std::cout << "obj : " << this << std::endl;
    std::cout << "current line: " << __LINE__ << std::endl;
}
